feat(telemetry): add export command#953
Open
EhabY wants to merge 9 commits into
Open
Conversation
35eba99 to
821a950
Compare
18ab98f to
5523f85
Compare
821a950 to
728e014
Compare
728e014 to
c450036
Compare
c450036 to
4daf2f8
Compare
ab7dcf4 to
acadd7e
Compare
4daf2f8 to
9534418
Compare
539131f to
fe6675e
Compare
25db18c to
d70fc4b
Compare
55cccf2 to
71bcce7
Compare
e762a74 to
1a94594
Compare
7ce5f22 to
d9f955a
Compare
1a94594 to
5439875
Compare
Move `tempFilePath` and `renameWithRetry` from `src/util.ts` into a focused `src/util/fs.ts`, alongside a new `writeAtomically(path, write)` helper that captures the temp-file + rename + best-effort cleanup pattern previously copy-pasted into the telemetry writer and `CliCredentialManager.atomicWriteFile`. Both call sites now use the shared helper; the SSH config / support bundle / CLI manager keep their bespoke flows and just update imports. Rewrite `writeJsonArrayExport` to stream chunks through `Readable.from(...)` into `createWriteStream` via `stream/promises` `pipeline`. Memory stays flat regardless of `maxTotalBytes`, which has no enforced ceiling and can comfortably exceed the default 100 MB cap. Tests for `tempFilePath` and `renameWithRetry` move into `test/unit/util/fs.test.ts` alongside a new `writeAtomically` suite covering success, partial-write rollback, and callback return values.
- Move src/telemetry/export/writers.ts to writers/json.ts and the
matching test to writers/json.test.ts. The writer keeps the same
shape; the doc comment is tightened and the test drops a
redundant atomic-failure assertion already covered by
writeAtomically's own tests.
- Extract parseTelemetryTimestampMs from range.ts's
isTimestampInRange so other export writers can reuse it.
- Add a trivial asyncIterable test helper to test/mocks/.
- Inline the duplicated `vi.mock("node:fs", ...)` /
`vi.mock("node:fs/promises", ...)` factory pair (9 lines per file)
as a 2-line dynamic import in the affected test files.
Upstream-compatible groundwork for the OTLP writer branch (#961);
isolates move + helper-extraction churn so that PR's diff stays
focused on OTLP-specific work.
- Add a required onCleanupError callback to writeAtomically and writeJsonArrayExport so callers cannot silently lose temp-file cleanup diagnostics (matters on Windows, where AV/Indexer locks can leave large export orphans). cliCredentialManager passes its logger to restore the warn-on-cleanup behavior that existed before the extraction. - Wrap the rm+callback chain in a try/catch so a throwing onCleanupError can't replace the original write error. - Document that writeAtomically requires the parent directory to exist. - Use suffix "temp" so the call matches the doc example and the cliManager convention. - Cover the cleanup-failure path with new tests: callback invoked with the rm error, and a throwing callback still surfaces the writer's error. - Tighten the json writer's midstream-error test to assert the destination survives and no temp file is left behind. - Fix the asyncIterable helper's docstring: it exercises async iteration, not stream backpressure.
After the 999->888 takeover, the 888 monitor would eventually fail network reads, call processLost, then searchForProcess would find 888 again and emit ssh.process.recovered (same-PID rediscovery). On slow CI runners that race won the negative assertion at sshProcess.test.ts:469. Return [] from find after the takeover so no rediscovery is possible.
d9f955a to
f7308bf
Compare
541629e to
e31dd3e
Compare
- Restructure: writers.ts → writers/json.ts; combine OTLP mapping and writer into writers/otlp.ts; lift signal classification into export/signal.ts. - Group all records of each signal under a single Resource block per file (was one Resource per event), matching the OTLP spec's recommended shape and shrinking exports at scale. - Adopt OTLP enums from @opentelemetry/api + api-logs; document the +1 wire offset on SpanKind. - Tighten the public surface: only writeOtlpZipExport and OtlpExportCounts are exported; record mappers are module-private. - Hoist per-event metric attributes once; single-pass partition of http.requests measurements into counts and gauges. - Share parseTelemetryTimestampMs between range.ts and the OTLP writer's nanos conversion (was duplicated with identical error). - Extract asyncIterable test helper to test/mocks/; inline the memfs vi.mock pair across affected test files. - Tests now exercise the public API only, dropping side-effect assertions about staging cleanup and atomic semantics already covered by writeAtomically's own tests.
Wire-format fixes: - Switch http.requests count_* sums from DELTA to CUMULATIVE temporality (Prom/Mimir/Grafana Cloud reject the delta+sum combination). - Maintain per-series running totals across the export, anchored at the first observed window's startTimeUnixNano. - Suppress zero-cumulative counters so routes that never errored don't ship empty data points. Semantic-convention compliance: - Use OTel-standard `service.instance.id` (was `coder.session.id`) and `host.id` (was `coder.machine.id`) for portability with OTel-aware backends. The previous vendor keys were pure aliases. - Add `schemaUrl` to each ResourceLogs/ResourceSpans/ResourceMetrics container and each scope container. - Stamp scope.version with the extension version.
f7308bf to
6ac4715
Compare
e31dd3e to
87b5f8d
Compare
3187fae to
4574a38
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
coder.exportTelemetrycommand UI flowCommandManagerand package contributionsCloses #903.
Follow-up: #952 tracks adding recent local telemetry to support bundles.
Stack: 4 / 4. Base: #961.
Review follow-up
TelemetryService.flush()Validation
pnpm test:extension ./test/unit/telemetry/export/range.test.ts ./test/unit/telemetry/export/files.test.ts ./test/unit/telemetry/export/writers.test.ts ./test/unit/core/commandManager.test.tspnpm test:extensionpnpm typecheckpnpm lintpnpm format:checkpnpm buildGenerated by Coder Agents.